package org.dandsoft.blackbox.laboratory.tests;

import junit.framework.TestCase;
import org.dandsoft.blackbox.snn.Environment;
import org.dandsoft.blackbox.snn.ObjectId;
import org.dandsoft.blackbox.snn.Value;

import java.util.ArrayList;

/**
 * <p>
 * Тест проверяет способность системы запосмнить полную систему сигналов. Хороший результат
 * это когда в результате сформировано столько триггеров, сколько входных образов было подано.
 * Тест проходит с флагом {@link org.dandsoft.blackbox.snn.Environment#isTimeFeeling() timeFeeling} = false.
 * </p>
 *
 * @author Vilyuzhanin Denis (Fin)
 */
public class MaxSpaceTest extends TestCase {

    public final static int SMALL_SIGNALS_COUNT = 4;
    public final static int SIGNALS_COUNT = 8;
    public final static int BIG_SIGNALS_COUNT = 16;

    private Environment environment;

    @Override
    protected void setUp() throws Exception {
        environment = new Environment();
        environment.setTimeFeeling(false);
    }

    public void testFirst() throws Exception {
        ArrayList<ObjectId> inputs = new ArrayList<ObjectId>(SMALL_SIGNALS_COUNT);
        for (int i = 0; i < SMALL_SIGNALS_COUNT; i++) {
            inputs.add(environment.createInput());
        }

        ArrayList<Value> values = new ArrayList<Value>(SMALL_SIGNALS_COUNT);
        for (int i = 0; i < SMALL_SIGNALS_COUNT; i++) {
            values.add(Value.PASSIVE);
        }

        do {
            for (int i = 0; i < values.size(); i++) {
                environment.input(inputs.get(i), values.get(i));
            }
            environment.alive();
            environment.study();
            //environment.reset();
        } while (next(values, Value.ACTIVE, Value.PASSIVE, Value.ACTIVE));
        System.out.println();
    }

    public static boolean next(ArrayList<Value> values, Value step, Value minValue, Value maxValue) {
        boolean isOverflow = true;
        for (int i = 0; i < values.size(); i++) {
            Value value = values.get(i);
            if (isOverflow) {
                isOverflow = false;
                value = value.add(step);
                if (value.isGreater(maxValue)) {
                    isOverflow = true;
                    values.set(i, minValue);
                } else {
                    values.set(i, value);
                    return true;
                }
            }

        }

        return false;
    }


}
